// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.SQLKeep.DenseRank;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause.FlashCacheType;
// import com.alibaba.druid.sql.dialect.oracle.ast.expr.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint.Initially;
// import com.alibaba.druid.sql.parser.*;
// import com.alibaba.druid.util.FnvHash;

// import java.math.BigInteger;
// import java.util.Arrays;
// import java.util.List;
#pragma once
#include "../../../parser/SQLExprParser.h"

class OracleExprParser : virtual public SQLExprParser
{
private:
  static BOOL_ptr __init;
  static BOOL_ptr init();

public:
  BOOL_ptr allowStringAdditive;

  static std::shared_ptr<std::vector<string_ptr>> AGGREGATE_FUNCTIONS;

  static std::shared_ptr<std::vector<long>> AGGREGATE_FUNCTIONS_CODES;

  OracleExprParser(Lexer_ptr lexer);

  OracleExprParser(string_ptr text);

  OracleExprParser(string_ptr text, SQLParserFeature_list_ptr features);

  BOOL_ptr isCharType(long hash);

  SQLDataType_ptr parseDataType(BOOL_ptr restrict);

  SQLExpr_ptr primary();

  // @Override
  SQLExpr_ptr methodRest(SQLExpr_ptr expr, BOOL_ptr acceptLPAREN);

  SQLExpr_ptr primaryRest(SQLExpr_ptr expr);

  SQLExpr_ptr dotRest(SQLExpr_ptr expr);

  SQLAggregateExpr_ptr parseAggregateExpr(string_ptr methodName);

  // @SuppressWarnings("unused")
  OracleIntervalType_ptr parseIntervalType();

  // @Override
  SQLSelectParser_ptr createSelectParser();

  SQLExpr_ptr parseInterval();

  SQLExpr_ptr relationalRest(SQLExpr_ptr expr);

  SQLName_ptr name();

  OraclePrimaryKey_ptr parsePrimaryKey();

  OracleUsingIndexClause_ptr parseUsingIndex();

  SQLColumnDefinition_ptr parseColumnRest(SQLColumnDefinition_ptr column);

  SQLExpr_ptr exprRest(SQLExpr_ptr expr);

  SQLObject_ptr parseOpaque();

  OracleLobStorageClause_ptr parseLobStorage();

  OracleStorageClause_ptr parseStorage();

  SQLUnique_ptr parseUnique();

  OracleConstraint_ptr parseConstaint();

  OracleForeignKey_ptr createForeignKey();

  SQLCheck_ptr createCheck();

  SQLPartition_ptr parsePartition();

  SQLPartitionBy_ptr parsePartitionBy();

  SQLPartitionByList_ptr partitionByList();

  SQLSubPartition_ptr parseSubPartition();

  void parseSegmentAttributes(OracleSegmentAttributes_ptr attributes);

  SQLPartitionByRange_ptr partitionByRange();

  void parsePartitionByRest(SQLPartitionBy_ptr clause);

  SQLSubPartitionBy_ptr subPartitionBy();

  void partitionClauseRest(SQLPartitionBy_ptr clause);

  SQLPartitionByHash_ptr partitionByHash();
};
